package com.yunkeji.common.filter;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.yunkeji.common.constant.CacheConstants;
import com.yunkeji.common.core.domain.model.LoginUser;
import com.yunkeji.common.utils.redis.RedisUtils;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import java.io.IOException;
import java.time.Duration;

/** Token 自动刷新 过滤器 */
@Slf4j
public class TokenAutoRenew implements Filter {

    private Integer saTokenExpire;

    public TokenAutoRenew(Integer saTokenExpire) {
        this.saTokenExpire = saTokenExpire;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 根据token获取用户id（这里如果找不到id直接返回null，不会报错）
        String tokenValue = StpUtil.getTokenValue();
        // 根据token获取用户id（这里如果找不到id直接返回null，不会报错）
        String loginId = (String) StpUtil.getLoginIdByToken(tokenValue);
        if (StrUtil.isEmpty(tokenValue) || StrUtil.isEmpty(loginId)) {
            chain.doFilter(request, response);
            return;
        }
        SaSession tokenSessionByToken = StpUtil.getTokenSessionByToken(tokenValue);
        LoginUser loginUser = (LoginUser) tokenSessionByToken.getDataMap().get("loginUser");

        StpUtil.renewTimeout(saTokenExpire); // 用于token续期
        StpUtil.updateLastActiveToNow();
        String refreshToken = SecureUtil.md5(tokenValue);
        RedisUtils.setCacheObject(
                CacheConstants.REFRESH_TOKEN + refreshToken,
                loginUser.getUsername(),
                Duration.ofSeconds(saTokenExpire * 2));

        chain.doFilter(request, response);
        return;
    }

    @Override
    public void destroy() {}
}
